package com.hzqx.syndata.aop.aspect;

import com.hzqx.syndata.result1.ResultBuilder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * aop具体实现
 * @author yinzhiping
 */
@Aspect
@Component
public class TestAdvice {
    /**
     * 1. 定义 PointCut
     */
    @Pointcut("execution(* com.hzqx.syndata.aop.service.TestAopService.eatCarrot())")
    private void eatCarrot(){}

    /**
     * 2. 定义应用于 JoinPoint 中所有满足 PointCut 条件的 advice, 这里我们使用 around advice，在其中织入增强逻辑
     * @param point
     * @throws Throwable
     */
    @Around("eatCarrot()")
    public void handlerRpcResult(ProceedingJoinPoint point) throws Throwable {
        System.out.println("吃萝卜前洗手");
        //  原来的 TestServiceImpl.eatCarrot 逻辑，可视情况决定是否执行
        point.proceed();
        System.out.println("吃萝后买单");
    }


    /**
     * 1. 定义所有带有 GlobalErrorCatch 的注解的方法为 Pointcut
     */
    @Pointcut("@annotation(com.hzqx.syndata.aop.annotion.GlobalErrorCatch)")
    private void globalCatch(){}


    /**
     *  // 2. 将 around advice 作用于 globalCatch(){} 此 PointCut
     * @param point
     * @return
     * @throws Throwable
     */
    @Around("globalCatch()")
    public Object handlerGlobalResult(ProceedingJoinPoint point) throws Throwable {
        try {
            return point.proceed();
        } catch (Exception e) {
            System.out.println("执行错误" + e);
            return "系统错误";
        }
    }

}
